
/*
\begin{listingcont}
*/
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <setjmp.h>
#include <pthread.h>
#include <errno.h>
#include <limits.h>

//pointer mangling definition
#include "mangling.h"

//Function Pointer
typedef int (*schedFuncPtr_t)(void *);

/// Scheduler context
typedef struct _chedContext{
	char* name;		// Name
	unsigned int prio;	// Priority
	jmp_buf env;            //environment for setjmp/longjmp
	schedFuncPtr_t func;    //pointer to thread function
	void *args;             //arguments = local data
	int running;            //current state: start, running, finished
	int argsize;		// Anzhal der Argumenten 
	int runde;		// Anzhal der Runde zu machen, bis Aktievierung

    	struct _chedContext* next;	// Zeiger auf Naechste Scheduler Context
    	struct _chedContext* prev;	// Zeiger auf vorherige Scheduler Context

} chedContext;


/// Structur fuer die RingListe
typedef struct _listRingContext
{
	// Kopf
	struct _chedContext* head;
	
	/* Laufer,
	 * Wird von der Scheduler benutzt um 
	 * die Kontext durchzulauffen
	*/ 
	struct _chedContext* curr;
	//
	jmp_buf env;
	// Anzahl von Thread
	int length;

} listRingContext;

/**
* RingListe
*/
extern listRingContext chedRing;

/**
* Registriert neue Thread bei den Scheduler
*/
int schedRegisterUserThread(schedFuncPtr_t func,
                            void *args,
                            unsigned int argsize,
                            char *name,
                            unsigned int prio);



/**
* Unregistriert ein Thread bei den Scheduler
*/
void schedUnregisterUserThread(char *name);

/**
* Activiert alle registriert Thread
*/
void schedActivateUserThread();


///Hilfe Funktionnen

/**
* freiewillige Kontext wechsel
*/
void schedYield();

/**
* Starten ein Thread
*/
void schedWrapper();

/**
* Fuegt neue Element in der Liste
*/
int insert(chedContext* element);

/**
* Stoppt die Threads und Loescht die Liste
*/
void chedClean();

/*
\end{listingcont}
*/

